export function commonUtils() {

    /**
     * 通过key获取Url参数
     * @param paramName
     * @returns
     */
    const getUrlParam = (paramName) => {
        const queryString = window.location.search;
        const urlParams = new URLSearchParams(queryString);
        return urlParams.get(paramName);
    }

    /**
     * 数组去重
     * @param array
     * @returns {Array}
     */
    const removeRepeatArray = (array) => {
        let temp = []; //一个新的临时数组
        for (let i = 0; i < array.length; i++) {
            if (temp.indexOf(array[i]) === -1) {
                temp.push(array[i]);
            }
        }
        return temp;
    }

    /**
     * 通过key和value获取json数组中的对象
     * @param json
     * @param key
     * @param value
     * @returns
     */
    const getJsonItemByKeyAndValue = (json, key, value) => {
        let item = [];
        for (let j_i = 0, j_len = json.length; j_i < j_len; j_i++) {
            let oneData = json[j_i];
            if (oneData[key] === value) {
                item.push(oneData);
            }
        }
        return item;
    }

    /**
     * 获取格式化时间
     * @param dateFormat
     * @returns
     */
    const getDateFormat = (dateFormat) => {
        let date = new Date();
        if (dateFormat.indexOf("yyyy") !== -1) {
            dateFormat = dateFormat.replace("yyyy", date.getFullYear());
        }
        if (dateFormat.indexOf("MM") !== -1) {
            let month = date.getMonth() + 1;
            if (month < 10) month = "0" + month;
            dateFormat = dateFormat.replace("MM", month);
        }
        if (dateFormat.indexOf("dd") !== -1) {
            let _date = date.getDate();
            if (_date < 10) _date = "0" + _date;
            dateFormat = dateFormat.replace("dd", _date);
        }
        if (dateFormat.indexOf("HH") !== -1) {
            let hours = date.getHours();
            if (hours < 10) hours = "0" + hours;
            dateFormat = dateFormat.replace("HH", hours);
        }
        if (dateFormat.indexOf("mm") !== -1) {
            let minutes = date.getMinutes();
            if (minutes < 10) minutes = "0" + minutes;
            dateFormat = dateFormat.replace("mm", minutes);
        }
        if (dateFormat.indexOf("ss") !== -1) {
            let seconds = date.getSeconds();
            if (seconds < 10) seconds = "0" + seconds;
            dateFormat = dateFormat.replace("ss", seconds);
        }
        if (dateFormat.indexOf("SSS") !== -1) {
            let milliseconds = date.getMilliseconds();
            if (milliseconds < 10) milliseconds = "00" + milliseconds;
            else if (milliseconds >= 10 && milliseconds < 100) milliseconds = "0" + milliseconds;
            dateFormat = dateFormat.replace("SSS", milliseconds);
        }
        return dateFormat;
    }

    /**
     * 将数值转换成货币格式，保留指定小数位数
     * @param {number|string} value - 需要格式化的数值
     * @param {number} decimalPlaces - 保留的小数位数，范围0-20，默认2
     * @returns {string} 格式化后的货币字符串，或"NaN"、"N/A"
     */
    const formatMoney = (value, decimalPlaces = 2) => {
        // 校验并规范化小数位数
        decimalPlaces = Math.max(0, Math.min(20, Math.floor(decimalPlaces)));

        // 处理无效输入
        if (value === undefined || value === null || value === '') {
            return "N/A";
        }

        // 提取数值并格式化小数部分
        const sanitizedValue = String(value).replace(/[^\d.-]/g, '');
        const numericValue = parseFloat(sanitizedValue);

        if (isNaN(numericValue)) {
            return "NaN";
        }

        const formattedNumber = numericValue.toFixed(decimalPlaces);
        const [integerPart, fractionalPart] = formattedNumber.split('.');

        // 处理整数部分的千位分隔符
        const reversedDigits = integerPart.split('').reverse();
        let groupedDigits = '';

        for (let i = 0; i < reversedDigits.length; i++) {
            groupedDigits += reversedDigits[i];
            // 每三位添加逗号，但最后一组不添加
            if ((i + 1) % 3 === 0 && (i + 1) !== reversedDigits.length) {
                groupedDigits += ',';
            }
        }

        // 恢复正确顺序并拼接小数部分
        const formattedInteger = groupedDigits.split('').reverse().join('');
        return `${formattedInteger}.${fractionalPart}`;
    }

    return {
        getUrlParam,
        getDateFormat,
        removeRepeatArray,
        getJsonItemByKeyAndValue,
        formatMoney
    }
}
